combit List & Label 29 - .NET Help
Programming Introduction / Other Important Concepts / Multithreading and Protection Job
In This Topic
    Multithreading and Protection Job
    In This Topic

    List & Label can be used from multiple threads. This enables the distribution of large print jobs on multiple different processors / cores. Internally, this is used for the designer preview or drill down reporting. If you plan to use List & Label in a multithreaded environment, keep the following issues in mind.

     

    List & Label Objects in Threads

    Make sure that each List & Label job (resp. a component instance) is only used within a single thread, i.e. the creation, usage and destruction of the job/component needs to be done from the same thread. If you want to use multiple printing threads, each of these threads needs to open and close it's own job. Background: Windows GDI resources like window handles or printer device contexts cannot be used across different threads.

     

    Protection Job

    Make sure to open a job/create a component instance in your application before starting the first print thread and do not close this job before all threads are terminated. Typically, this will be done in your application's start-up and shutdown code. Background: the first job creates a couple of helper objects that need to be destroyed in the same job. Also, this can increase the performance remarkably as it avoids steady loading and unloading of DLLs.

    Note: If List & Label is to work independently of printer drivers (usually in web applications etc.), the printerless mode can be activated for this purpose. The Printerless property must be set in the first object/protection job. A mixture of enabled and disabled printerless mode in the objects used in the application is not supported and can lead to unexpected behavior.

     

    Thread-Model

    Threads that open the designer need to use the Single Threaded Apartment (STA) concurrency model. This means you cannot use .NET worker threads from the thread pool for this task, as they are initialized to use the Multi Threaded Apartment (MTA) concurrency model. Background: List & Label needs to call OleInitialize() for drag & drop support within the designer, which requires the current apartment to be STA to succeed.